{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 开放-封闭原则\n",
    "\n",
    "开放-封闭原则，是说软件实体（类，模块，函数等）应该可以扩展，但是不可修改。即对扩展开放（Open for extension） ，对更改封闭（Closed for modification）。\n",
    "\n",
    "软件需求是一定会变化的，在设计软件系统的时候遵循开放-封闭原则，当面对需求的变化时，可以相对容易修改，保持相对稳定。\n",
    "\n",
    "设计软件要容易维护又不容易出问题的最好办法，就是多扩展，少修改。\n",
    "\n",
    "绝对的对修改关闭是不可能的。无论模块多么的“封闭”，都会存在一些无法对之封闭的变化。既然不可能完全封闭，设计人员必须对于他设计的模块应对哪种变化封闭作出选择。他必须先猜测出最有可能发生的变化种类，然后构造抽象来隔离那些变化。并且，当变化发生时，应当立即采取行动。\n",
    "\n",
    "在我们最初编写代码时，假设变化不会发生。当变化发生时，我们就创建抽象来隔离以后发生的同类变化。\n",
    "\n",
    "面对需求，对程序的改动是通过增加新代码进行的，而不是更改现有的代码。\n",
    "\n",
    "我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生变化所等待的时间越长，要创建正确的抽象就越困难。\n",
    "\n",
    "开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对下岗技术所声称的巨大好处，也就是可维护，可扩展，可复用，灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分作出抽象，然而，对于应用程序中的每个部分都刻意的进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要，避免矫枉过正。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
